#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

pid_t id;   // 将子进程的id设为全局变量，方便对比

void handler(int signo)
{
    printf("进程 %d 捕捉到了 %d 号信号\n", getpid(), signo);

    // 这里的 -1 表示父进程等待时，只要是已经退出了的子进程，都可以进行回收
    pid_t ret = waitpid(-1, NULL, 0);
    if(ret > 0)
        printf("父进程: %d 已经成功回收了 %d 号进程，之前的子进程是 %d\n", getpid(), ret, id);
}

int main()
{
    signal(SIGCHLD, handler);

    id = fork();
    if(id == 0)
    {
        int n = 5;
        while(n)
        {
            printf("子进程剩余生存时间: %d秒 [pid: %d  ppid: %d]\n", n--, getpid(), getppid());
            sleep(1);
        }

        // 子进程退出
        exit(-1);
    }

    // 父进程很忙的话，可以去做自己的事
    while(1)
    {
        // TODO
        printf("父进程正在忙...\n");
        sleep(1);
    }

    return 0;
}
